試用期只剩1天! 意思是表示鐵人賽快要忙完了。
真佩服其他神人的分享精神,我自己覺得我只是每天抽出一點時間來發文而已,但有些神人感覺是在燃燒小宇宙。
今天閱讀的是這篇鐵人賽,然後用作者的教學資料與自己之前的企鵝資料實作。
Elastic Stack第十一重
首先建議用 Dev Tools (Console) 進行開發,因為它有智慧提示功能。
像是欄位名稱的提示:
這邊另外要注意:GET/PUT/POST/DELETE 指令與 JSON中間不要留有空白
如果你像我笨笨的多了一行空白 ↓↓↓↓ ,錯誤示範:
Console 執行時會理解為單純的 "GET /df_penguins/_search" 指令,而不理會後面 JSON 檔案中的聚合查詢。所以我花了不少時間去測試為什麼別人的 bank 資料可以回傳聚合值,我的企鵝資料卻無法回傳聚合值。明明檢查 mapping 的型式也幾乎相同啊。結果是自己笨...
在 Console 確認程式碼OK後,再讓我們到 R 透過 Elastic 套件進行聚合查詢吧
library(elastic)
library(palmerpenguins) # 企鵝資料集
library(data.table) # 資料整理
library(ggplot2) # 畫圖神器
# Connect OK!
x <- connect(
host = "111.asia-east1.gcp.elastic-cloud.com",
path = "",
user = "elastic",
pwd = "111",
port = 9243,
transport_schema = "https"
)
# 如果還沒有上傳資料記得使用 docs_bulk( ) 進行上傳
# docs_bulk(x, penguins, "df_penguins")
# 銀行的分群計算範例
# 等價 SQL:(select island count(*) from bank2 group by state )
aggs <- '
{ "aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}'
# 回傳 list 資料,回傳為了簡單點可以直接 $ 取值
Search( conn =x , index = "bank2" , body = aggs , size = 0)$aggregations$group_by_state$buckets
# 企鵝的分群計數範例
# 等價 SQL:(select island , count(*) as group_by_island from df_penguins group by island )
aggs2 <- '
{
"aggs": {
"group_by_island": {
"terms": {
"field": "island.keyword"
}
}
}
}
'
island_counts <- Search( conn =x , index = "df_penguins" , body = aggs2 , size = 0)$aggregations$group_by_island$buckets
# list 轉成 data.table 格式
island_counts_dt <- rbindlist(island_counts)
# key doc_count
# 1: Biscoe 168
# 2: Dream 124
# 3: Torgersen 52
# 最後使用 ggplot2進行圖形繪製
ggplot(data =island_counts_dt , aes( x= key , y = doc_count) ) + geom_bar(stat="identity")
最後使用 ggplot2 畫出企鵝在各島上的分布數量。
也許有人會說,這麼簡單的東西,有需要使用 ElasticSearch 操作嗎? 因為企鵝資料集是結構化的資料啊;如果今天是很複雜的文字尋找過濾後進行計數。雖然在 R 或 Python 中可以透過正規表達式硬幹,但終究不是可以高度處理大資料的架構。
另外,真心建議雖然 ElasticSearch 是處理非結構化資料的利器。但在學習階段,還是先透過小型的結構化資料進行學習哦....否則你的信心會喪失的飛快的。